home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / ASM-SPAR.{_A / SEMAPHOR.{15 < prev    next >
Text File  |  1999-09-17  |  3KB  |  155 lines

  1. #ifndef _SPARC64_SEMAPHORE_H
  2. #define _SPARC64_SEMAPHORE_H
  3.  
  4. /* These are actually reasonable on the V9. */
  5. #ifdef __KERNEL__
  6.  
  7. #include <asm/atomic.h>
  8. #include <asm/system.h>
  9.  
  10. struct semaphore {
  11.     atomic_t count;
  12.     atomic_t waking;
  13.     struct wait_queue * wait;
  14. };
  15.  
  16. #define MUTEX ((struct semaphore) { ATOMIC_INIT(1), ATOMIC_INIT(0), NULL })
  17. #define MUTEX_LOCKED ((struct semaphore) { ATOMIC_INIT(0), ATOMIC_INIT(0), NULL })
  18.  
  19. extern void __down(struct semaphore * sem);
  20. extern int  __down_interruptible(struct semaphore * sem);
  21. extern int  __down_trylock(struct semaphore * sem);
  22. extern void __up(struct semaphore * sem);
  23.  
  24. #define sema_init(sem, val)    atomic_set(&((sem)->count), val)
  25.  
  26. extern __inline__ void down(struct semaphore * sem)
  27. {
  28.         __asm__ __volatile__("
  29.     1:    lduw    [%0], %%g5
  30.         sub    %%g5, 1, %%g7
  31.         cas    [%0], %%g5, %%g7
  32.         cmp    %%g5, %%g7
  33.         bne,pn    %%icc, 1b
  34.          cmp    %%g7, 1
  35.         bl,pn    %%icc, 3f
  36.          membar    #StoreStore
  37.     2:
  38.         .subsection 2
  39.     3:    mov    %0, %%g5
  40.         save    %%sp, -160, %%sp
  41.         mov    %%g1, %%l1
  42.         mov    %%g2, %%l2
  43.         mov    %%g3, %%l3
  44.         call    %1
  45.          mov    %%g5, %%o0
  46.         mov    %%l1, %%g1
  47.         mov    %%l2, %%g2
  48.         ba,pt    %%xcc, 2b
  49.          restore %%l3, %%g0, %%g3
  50.         .previous\n"
  51.     : : "r" (__atomic_fool_gcc(sem)), "i" (__down)
  52.     : "g5", "g7", "memory", "cc");
  53. }
  54.  
  55. extern __inline__ int down_interruptible(struct semaphore *sem)
  56. {
  57.     int ret = 0;
  58.     
  59.         __asm__ __volatile__("
  60.     1:    lduw    [%2], %%g5
  61.         sub    %%g5, 1, %%g7
  62.         cas    [%2], %%g5, %%g7
  63.         cmp    %%g5, %%g7
  64.         bne,pn    %%icc, 1b
  65.          cmp    %%g7, 1
  66.         bl,pn    %%icc, 3f
  67.          membar    #StoreStore
  68.     2:
  69.         .subsection 2
  70.     3:    mov    %2, %%g5
  71.         save    %%sp, -160, %%sp
  72.         mov    %%g1, %%l1
  73.         mov    %%g2, %%l2
  74.         mov    %%g3, %%l3
  75.         call    %3
  76.          mov    %%g5, %%o0
  77.         mov    %%l1, %%g1
  78.         mov    %%l2, %%g2
  79.         mov    %%l3, %%g3
  80.         ba,pt    %%xcc, 2b
  81.          restore %%o0, %%g0, %0
  82.         .previous\n"
  83.     : "=r" (ret)
  84.     : "0" (ret), "r" (__atomic_fool_gcc(sem)), "i" (__down_interruptible)
  85.     : "g5", "g7", "memory", "cc");
  86.     return ret;
  87. }
  88.  
  89. extern inline int down_trylock(struct semaphore *sem)
  90. {
  91.     int ret = 0;
  92.         __asm__ __volatile__("
  93.     1:    lduw    [%2], %%g5
  94.         sub    %%g5, 1, %%g7
  95.         cas    [%2], %%g5, %%g7
  96.         cmp    %%g5, %%g7
  97.         bne,pn    %%icc, 1b
  98.          cmp    %%g7, 1
  99.         bl,pn    %%icc, 3f
  100.          membar    #StoreStore
  101.     2:
  102.         .subsection 2
  103.     3:    mov    %2, %%g5
  104.         save    %%sp, -160, %%sp
  105.         mov    %%g1, %%l1
  106.         mov    %%g2, %%l2
  107.         mov    %%g3, %%l3
  108.         call    %3
  109.          mov    %%g5, %%o0
  110.         mov    %%l1, %%g1
  111.         mov    %%l2, %%g2
  112.         mov    %%l3, %%g3
  113.         ba,pt    %%xcc, 2b
  114.          restore %%o0, %%g0, %0
  115.         .previous\n"
  116.     : "=r" (ret)
  117.     : "0" (ret), "r" (__atomic_fool_gcc(sem)), "i" (__down_trylock)
  118.     : "g5", "g7", "memory", "cc");
  119.     return ret;
  120. }
  121.  
  122. extern __inline__ void up(struct semaphore * sem)
  123. {
  124.     __asm__ __volatile__("
  125.         membar    #StoreLoad | #LoadLoad
  126.     1:    lduw    [%0], %%g5
  127.         add    %%g5, 1, %%g7
  128.         cas    [%0], %%g5, %%g7
  129.         cmp    %%g5, %%g7
  130.         bne,pn    %%icc, 1b
  131.          addcc    %%g7, 1, %%g0
  132.         ble,pn    %%icc, 3f
  133.          nop
  134.     2:
  135.         .subsection 2
  136.     3:    mov    %0, %%g5
  137.         save    %%sp, -160, %%sp
  138.         mov    %%g1, %%l1
  139.         mov    %%g2, %%l2
  140.         mov    %%g3, %%l3
  141.         call    %1
  142.          mov    %%g5, %%o0
  143.         mov    %%l1, %%g1
  144.         mov    %%l2, %%g2
  145.         ba,pt    %%xcc, 2b
  146.          restore %%l3, %%g0, %%g3
  147.         .previous\n"
  148.     : : "r" (__atomic_fool_gcc(sem)), "i" (__up)
  149.     : "g5", "g7", "memory", "cc");
  150. }    
  151.  
  152. #endif /* __KERNEL__ */
  153.  
  154. #endif /* !(_SPARC64_SEMAPHORE_H) */
  155.